package com.sicheng.蓝桥.国赛准备.第十三届JavaB;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/**
 * @author zsc
 * @version 1.0
 * @date 2022/6/19 9:06
 */
public class F小球称重 {
    /**
     * 【问题描述】
     * 小蓝有 N 个小球，编号 1 至 N。其中 N − 1 是正品，重量相同；有 1 个是
     * 次品，重量比正品轻。
     * 为了找出次品，小蓝已经用天平进行了 M 次称重，并且记录下来每次两边
     * 放的小球编号，和称重结果。
     * 请你根据记录，判断还剩下几个小球有次品的嫌疑。
     * 【输入格式】
     * 第一行包含 2 个整数 N 和 M。
     * 以下包含 M 次称重记录，每个记录占 4 行。
     * 第一行是一个整数 K，表示天平两边各放了 K 个小球。
     * 第二行包含 K 个整数，代表放在天平左边的小球编号。
     * 第三行包含 K 个整数，代表放在天平右边的小球编号。
     * 第四行是一个字符，为 ‘>’, ‘<’, ‘=’ 之一。‘>’ 代表左边比右边重，‘<’ 代
     * 表左边比右边轻，‘=’ 代表两边重量相等。
     * 在一次称重中保证每个小球最多出现 1 次。
     * 【输出格式】
     * 输出一个整数，代表答案。
     * 【样例输入】
     * 10 2
     * 3
     * 1 2 3
     * 4 5 6
     * <
     * 2
     * 3 7
     * 8 9
     * =
     * 【样例输出】
     * 2
     * 【样例说明】
     * {1, 2, 3} < {4, 5, 6} 能判断出次品在 {1, 2, 3} 之中。
     * {3, 7} = {8, 9} 能判断出 3 不可能是次品。
     * 所以只剩下 {1, 2} 可能是次品。
     * 【评测用例规模与约定】
     * 对于 40% 的数据，1 ≤ N ≤ 106;
     * 对于 100% 的数据，1 ≤ N ≤ 109, 1 ≤ M ≤ 105, 参与 M 次称重的小球总数
     * ≤ 106
     */
    public static void main(String[] args) {

        InputReader reader = new InputReader(System.in);
        int n = reader.readInt();
        int m = reader.readInt();
        // 每次称重读出来的小球编号
        int[] nums = new int[n + 1];

        // 存有次品嫌疑的  st[i]==true,i有次品嫌疑
        boolean[] st = new boolean[n + 1];
        while (m-- > 0) {
            int k = reader.readInt();
            for (int i = 0; i < 2 * k; i++) {
                nums[i] = reader.readInt();
            }
            String op = reader.read();
            if (op.equals("<")) {
                for (int i = 0; i < k; i++) {
                    st[nums[i]] = true;
                }
                for (int i = k; i < 2 * k; i++) {
                    st[nums[i]] = false;
                }
            } else if (op.equals(">")) {
                for (int i = k; i < 2 * k; i++) {
                    st[nums[i]] = true;
                }
                for (int i = 0; i < 2 * k; i++) {
                    st[nums[i]] = false;
                }
            } else {
                for (int i = 0; i < 2 * k; i++) {
                    st[nums[i]] = false;
                }
            }
        }

        long res = 0;
        for (int i = 1; i < st.length; i++) {
            if (st[i])
                res++;
        }

        System.out.println(res);
    }

    static class InputReader {

        BufferedReader reader;
        StringTokenizer token;

        public InputReader(InputStream in) {
            reader = new BufferedReader(new InputStreamReader(in));
        }

        String read() {

            while (token == null || !token.hasMoreTokens()) {
                try {
                    token = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return token.nextToken();
        }

        int readInt() {
            return Integer.parseInt(read());
        }
    }

}
